热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

集合|Collection的各子类小结

由前面的集合基础那篇博客中已经知道了collection类下有List和Set两

由前面的集合基础那篇博客中已经知道了collection类下有List和Set两个模块,此篇博客将List与Set中的一些关系和问题罗列一下,参照老师的笔记。

一、collection:

1、collection 和 collections 的区别

  • collection是上级接口,继承他的子类有List和Set;
  • collections是集合的工具类,提供一系列静态方法对集合的搜索、查找、同步操作;

2、Enumeration 和 Iterator 接口的区别:
Iterator代替了Enumeration接口,Enumeration是个旧的迭代器;
三点区别:

  • Iterator的方法名比Enumeration更科学;
  • Iterator比Enumeration更安全,因为当一个集合被遍历时它会阻止其他线程对集合的修改;
  • Iterator能够删除元素,而Enumeration不能删除元素;

二、List 部分:

1、list特点:
(1)有序(插入、删除的顺序一致)
(2)允许存储重复元素
(3)有索引(可以通过for循环遍历访问)
2、List下的ArrayList与LinkedList的区别和联系:
1.一方面(联系):
它们都有序、可重复、有索引
2.另一方面(区别):
ArrayList底层是通过可变数组实现的;LinkedList底层是通过双向链表实现的;

也因此可以分析ArrayList和LinkedList的源码:

  • ArrayList底层维护了一个Object类型的数组elementData。
  • 当创建对象的时候,如果不指定容量的话,默认初始化elementData数组的大小为0;如果指定容量的话,默认初始化elementData数组大小为capacity;
  • 当添加元素时,先判断是否需要扩容,不需要直接插入;如果需要扩容,先扩容后添加:第一次添加需要扩容—10、其他次添加需要扩容的话—1.5倍扩容;
  • LinkedList底层维护了两个节点Node类型的first和last变量(与链表无异),如果是第一次添加,LinkedList中的first和last都指向新对象;如果不是第一次添加,ArrayList中的last指向新对象。

注意:根据数组与链表的增删改查特点我们可联想到,ArrayList对于元素的随机访问速度比较快,但LinkedList则需要遍历链表来访问某个元素;但是对于增加和删除操作来说,ArrayList每增加或删除元素都需要挪动其他位置的元素,而LinkedList增加或删除只需要改变对应的前后指针即可。但也不是ArrayList的增删就一定比LinkedList慢的,深处种菱浅种稻,具体情况具体分析吧。*

3、List下的vector与ArrayList区别和联系:
1、一方面(联系):
都实现了List接口,他们都是有序的集合(存取),底层实现都是数组,有索引且允许元素重复出现。
2、另一方面(区别):

  • 同步性:vector是同步的、ArrayList是非同步的。但是用的时候即使需要一个同步的大多选择构造一个同步的ArrayList,而不是选用vector实现;
  • 扩容:vector扩容增长一倍,而ArrayList扩容增长0.5倍。

三、Set 部分

1、Set特点:
(1)无序
(2)不允许重复元素
(3)没有索引
2、HashSet 与 TreeSet 区别:

  1. 一方面(联系):它们是set的子类,都具有无序、无重复、无索引的特点;
  2. 另一方面(区别):
    (1)Hashset接口是无序、不可重复的集合;而TreeSet是有序的;
    (2)HashSet底层是Hash实现(数组+链表),线程不安全;而TreeSet底层是红黑树数据结构,默认就对元素排序了;
    (3)底层:HashSet实现了Set接口,由于是Hash表,实际上采用一个HashMap的实例,所有元素存储在HashMap的Key上,而value有一个固定的值,HashSet不存储重复元素iu是重写Hashcode()和equals()方法;TreeSet底层是用TreeMap实现的,构造方法中会采用一个TreeMap实例存放元素,添加元素时先判断有无比较器,如果有就根据比较器规则进行比较,没有比较器的话,就根据元素本身特性进行添加。

3、Comparable 与 Comparator 的区别
1、Comparable强行对实现它的每个类的对象进行整体排序;这种排序称为自然排序,Compara To()被称为他的自然比较方法,只能在类中实现Compara To()一次,不能经常修改类的代码实现自己的排序;
2、Comparator强行对某个对象进行整体排序,可以将comparator传递给sort方法(Arrays.sort;Collections.sort),从而允许在排序上精准控制;


推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
author-avatar
塞上秋雪_838
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有